/**
* Copyright (c) 2008, Aberystwyth University
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* - Neither the name of the Centre for Advanced Software and
* Intelligent Systems (CASIS) nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package org.purl.sword.client;
import java.awt.BorderLayout;
import java.util.Enumeration;
import java.util.Properties;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
/**
* Dialog that is used to edit the collection of properties.
*
* @author Neil Taylor, Suzana Barreto
*/
public class PropertiesDialog
{
/**
* The parent frame for the dialog that is displayed.
*/
private JFrame parentFrame = null;
/**
* Array that lists the labels for the buttons on the panel.
*/
private static Object[] options = {"OK", "Cancel" };
/**
* The panel that holds the controls to show.
*/
private JPanel controls = null;
/**
* The configuration properties
*/
private Properties properties = null;
/**
* Table that is used to display the list of properties.
*/
private JTable propertiesTable;
/**
* Create a new instance.
*
* @param parentFrame The parent frame for the dialog.
* @param props The properties lisst to display
*/
public PropertiesDialog(JFrame parentFrame, Properties props)
{
this.parentFrame = parentFrame;
properties = props;
controls = createControls();
}
/**
* Create the controls that are to be displayed in the system.
*
* @return A panel that contains the controls.
*/
protected JPanel createControls( )
{
JPanel panel = new JPanel(new BorderLayout());
propertiesTable = new JTable(new PropertiesModel());
((DefaultCellEditor)propertiesTable.getDefaultEditor(String.class)).setClickCountToStart(1);
JScrollPane scrollpane = new JScrollPane(propertiesTable,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
panel.add(scrollpane, BorderLayout.CENTER);
return panel;
}
/**
* Show the dialog and return the status code.
*
* @return The status code returned from the dialog.
*/
public int show( )
{
int result = JOptionPane.showOptionDialog(parentFrame,
controls,
"Edit Properties",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE,
null,
options,
null);
// cancel any edit in the table. If there is a cell editing, the getEditingColumn will
// return a non-negative column number. This can be used to retreive the cell editor.
// The code then gets the default editor and calls the stopCellEditing. If custom
// editors are used, an additional check must be made to get the cell editor
// for a specific cell.
int column = propertiesTable.getEditingColumn();
if( column > -1 )
{
TableCellEditor editor = propertiesTable.getDefaultEditor( propertiesTable.getColumnClass(column));
if( editor != null )
{
editor.stopCellEditing();
}
}
return result;
}
/**
* A table model that is used to show the properties. The model links directly
* to the underlying properties object. As changes are made in the table, the
* corresponding changes are made in the properties object. The user can only
* edit the value column in the table.
*/
public class PropertiesModel extends AbstractTableModel
{
/**
* Column names.
*/
private String columns[] = {"Property Name","Value"};
/**
* Create a new instance of the model. If no properties object exists,
* a default model is created. Note, this will allow the table to
* continue editing, although this value will not be passed back to
* the calling window.
*/
public PropertiesModel()
{
super();
if(properties == null)
{
properties = new Properties();
}
}
/**
* Get the number of columns.
*
* @return The number of columns.
*/
public int getColumnCount()
{
return columns.length;
}
/**
* Get the number of rows.
*
* @return The number of rows.
*/
public int getRowCount()
{
return properties.size();
}
/**
* Get the value that is at the specified cell.
*
* @param row The row for the cell.
* @param col The column for the cell.
*
* @return The data value from the properties.
*/
public Object getValueAt(int row, int col)
{
if(col == 0)
{
return getKeyValue(row);
}
else
{
String key = getKeyValue(row);
return properties.get(key);
}
}
/**
* Retrieve the column name for the specified column.
*
* @param col The column number.
*
* @return The column name.
*/
public String getColumnName(int col){
return columns[col];
}
/**
* Retrieve the column class.
*
* @param col The column number.
*
* @return The class for the object found at the column position.
*/
public Class getColumnClass(int col)
{
return getValueAt(0, col).getClass();
}
/**
* Determine if the cell can be edited. This model will only
* allow the second column to be edited.
*
* @param row The cell row.
* @param col The cell column.
*
* @param True if the cell can be edited. Otherwise, false.
*/
public boolean isCellEditable(int row, int col)
{
if(col == 1)
{
return true;
}
return false;
}
/**
* Set the value for the specified cell.
*
* @param value The value to set.
* @param row The row for the cell.
* @param col The column.
*/
public void setValueAt(Object value, int row, int col)
{
String key = getKeyValue(row);
properties.setProperty(key, ((String) value));
fireTableCellUpdated(row, col);
}
/**
* Get the Key value for the specified row.
* @param row The row.
* @return A string that shows the key value.
*/
public String getKeyValue(int row)
{
int count = 0;
Enumeration<Object> k = properties.keys();
while (k.hasMoreElements()) {
String key = (String) k.nextElement();
if(count == row){
return key;
}
count++;
}
return null;
}
}
}